package model.persistencia;

import java.sql.*;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import model.ClienteModel;
import model.ICliente;

public class ClienteDAO implements IGenericDAO {      
    
    private Statement stmt;
    private Connection conn;
    private PreparedStatement pstmt;
    private BancoDeDados conexaoBanco;    
    private ResultSet resultado;
    private ClienteModel cliente;

    public ClienteDAO(ClienteModel cliente) {
        conexaoBanco = new BancoDeDados();    
        this.cliente = cliente;        
    }
    
    @Override
    public void inserir() {       
        conn = null;
        pstmt = null;            
        conn = conexaoBanco.getConexao();   
        int index = 0;
        String sql = "INSERT INTO cliente(cliente_pk, nome, endereco, email, bairro, cidade, cep, estado, "
                + "fone, celular, cpf, obs, rg, orgaorg, datanasc, datacadastro, "
                + "cnpj, sexo, profissao, empresa, foneempresa, renda, referencia, fonereferencia, auditoria) "
                + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
        try {
            pstmt = conn.prepareStatement(sql);            
            pstmt.setInt(++index, cliente.getCodigo());
            pstmt.setString(++index, cliente.getNome());
            pstmt.setString(++index, cliente.getEndereco());
            pstmt.setString(++index, cliente.getEmail());
            pstmt.setString(++index, cliente.getBairro());
            pstmt.setString(++index, cliente.getCidade());
            pstmt.setString(++index, cliente.getCep());
            pstmt.setString(++index, cliente.getUf());
            pstmt.setString(++index, cliente.getFone());
            pstmt.setString(++index, cliente.getCelular());
            pstmt.setString(++index, cliente.getCpf());
            pstmt.setString(++index, cliente.getObs());
            pstmt.setString(++index, cliente.getRg()); 
            pstmt.setString(++index, cliente.getOrgaoRg());
            pstmt.setDate(++index, cliente.getDataNasc());
            pstmt.setDate(++index, cliente.getDataCadastro()); 
            pstmt.setString(++index, cliente.getCnpj());
            pstmt.setString(++index, cliente.getSexo());
            pstmt.setString(++index, cliente.getProfissao()); 
            pstmt.setString(++index, cliente.getEmpresa());
            pstmt.setString(++index, cliente.getFoneEmpresa());
            pstmt.setDouble(++index, cliente.getRenda());
            pstmt.setString(++index, cliente.getReferencia());
            pstmt.setString(++index, cliente.getFoneReferencia());
            pstmt.setString(++index, cliente.getAuditoria());                                    
            pstmt.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(ClienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro no no banco no cadastro de Cliente:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                pstmt.close();
                conn.close(); 
            } catch (SQLException ex) {
                Logger.getLogger(ClienteDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }            
        }
    }

    @Override
    public void excluir() {
        conn = null;
        pstmt = null;
        conn = conexaoBanco.getConexao(); 
        String sql = "DELETE FROM cliente WHERE cliente_pk = "+cliente.getCodigo()+";";  
        try {
            pstmt = conn.prepareStatement(sql);
            pstmt.execute();
        } catch (SQLException ex) {
            Logger.getLogger(ClienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro no no banco no Exclusão de Cliente:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                conn.close();
                pstmt.close();
            } catch (SQLException ex) {
                Logger.getLogger(ClienteDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }           
        }
    }

    @Override
    public void atualizar() {        
        conn = null;
        pstmt = null;       
        conn = conexaoBanco.getConexao();         
        String sql = "UPDATE cliente SET nome=?, endereco=?, email=?, bairro=?, cidade=?, "
                + "cep=?, estado=?, fone=?, celular=?, cpf=?, obs=?, rg=?, orgaorg=?, datanasc=?, datacadastro=?, "
                + "cnpj=?, sexo=?, profissao=?, empresa=?, foneempresa=?, renda=?, referencia=?, fonereferencia=?, "
                + "auditoria=? WHERE cliente_pk=?;";        
        try{
            pstmt = conn.prepareStatement(sql);                                    
            pstmt.setInt(25, cliente.getCodigo());
            pstmt.setString(1, cliente.getNome());
            pstmt.setString(2, cliente.getEndereco());
            pstmt.setString(3, cliente.getEmail());
            pstmt.setString(4, cliente.getBairro());
            pstmt.setString(5, cliente.getCidade());
            pstmt.setString(6, cliente.getCep());
            pstmt.setString(7, cliente.getUf());
            pstmt.setString(8, cliente.getFone());
            pstmt.setString(9, cliente.getCelular());
            pstmt.setString(10, cliente.getCpf());
            pstmt.setString(11, cliente.getObs());
            pstmt.setString(12, cliente.getRg()); 
            pstmt.setString(13, cliente.getOrgaoRg());
            pstmt.setDate(14, cliente.getDataNasc());
            pstmt.setDate(15, cliente.getDataCadastro()); 
            pstmt.setString(16, cliente.getCnpj());
            pstmt.setString(17, cliente.getSexo());
            pstmt.setString(18, cliente.getProfissao()); 
            pstmt.setString(19, cliente.getEmpresa());
            pstmt.setString(20, cliente.getFoneEmpresa());
            pstmt.setDouble(21, cliente.getRenda());
            pstmt.setString(22, cliente.getReferencia());
            pstmt.setString(23, cliente.getFoneReferencia());
            pstmt.setString(24, cliente.getAuditoria()); 
            pstmt.executeUpdate();                 
        }catch(SQLException ex) {
            Logger.getLogger(ClienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro ao execultar a Atualização de Cliente:\n"+
                    ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                pstmt.close();
                conn.close();                
            } catch (SQLException ex) {
                Logger.getLogger(ClienteDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }            
        }
    }   

    @Override
    public ArrayList pesquisar(int iOpcao, String iPesquisa) {
        ArrayList listaClientes = new ArrayList();        
        resultado = null;
        conn = null;        
        stmt = null;                           
        conn = conexaoBanco.getConexao();          
        try{        
            stmt = (Statement) conn.createStatement();            
            resultado = stmt.executeQuery(getSQL(iOpcao, iPesquisa));                
            while(resultado.next()) {
                ClienteModel clienteTemp = new ClienteModel();
                clienteTemp.setCodigo(resultado.getInt("cliente_pk"));                
                clienteTemp.setNome(resultado.getString("nome"));                
                clienteTemp.setEndereco(resultado.getString("endereco"));
                clienteTemp.setEmail(resultado.getString("email"));
                clienteTemp.setBairro(resultado.getString("bairro"));
                clienteTemp.setCidade(resultado.getString("cidade"));
                clienteTemp.setCep(resultado.getString("cep"));                
                clienteTemp.setUf(resultado.getString("uf"));
                clienteTemp.setFone(resultado.getString("fone"));
                clienteTemp.setCelular(resultado.getString("celular"));
                clienteTemp.setCpf(resultado.getString("cpf"));
                clienteTemp.setObs(resultado.getString("obs"));
                clienteTemp.setRg(resultado.getString("rg"));                
                clienteTemp.setDataCadastro(resultado.getDate("data_cadastro")); 
                clienteTemp.setAuditoria(resultado.getString("auditoria"));                                
                clienteTemp.setObs(resultado.getString("obs"));                                
                
                listaClientes.add(clienteTemp);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ClienteDAO.class.getName()).log(Level.SEVERE, null, ex);            
            JOptionPane.showMessageDialog(null, "Erro na Pesquisa de Clientees.\n"+
                    ex.getMessage(),"Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                conn.close();
                stmt.close();
                resultado.close();
            } catch (SQLException ex) {
                Logger.getLogger(ClienteDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }
        }               
        return listaClientes;
    }

    @Override
    public String getSQL(int iOpcao, String iPesquisa) {
        String sql = null;        
        switch (iOpcao){
            case ICliente.SQL_PRIMEIRO: sql = "SELECT MIN(cliente.cliente_pk) as cliente_pk FROM public.cliente;";break;
            case ICliente.SQL_ANTERIOR: sql = "SELECT MAX(cliente.cliente_pk) as cliente_pk FROM public.cliente "
                    + "WHERE cliente.cliente_pk < "+ iPesquisa +";";break;
            case ICliente.SQL_PROXIMO: sql = "SELECT MIN(cliente.cliente_pk) as cliente_pk FROM public.cliente "
                    + "WHERE cliente.cliente_pk > "+ iPesquisa +";";break;
            case ICliente.SQL_ULTIMO: sql = "SELECT MAX(cliente.cliente_pk) as cliente_pk FROM public.cliente;";break;
            case ICliente.SQL_CODIGO: sql = "SELECT cliente.cliente_pk, cliente.nome, cliente.endereco, cliente.email, "
                    + "cliente.cidade, cliente.bairro, cliente.cep, cliente.uf, cliente.celular, "
                    + "cliente.fone, cliente.cpf, cliente.obs, cliente.rg, cliente.orgaorg, "
                    + "cliente.data_cadastro, cliente.cnpj, cliente.contato, cliente.fax, cliente.auditoria "
                    + "FROM public.cliente WHERE cliente.cliente_pk = "+ iPesquisa +";";break;
            case ICliente.SQL_NOME: sql = "SELECT cliente.cliente_pk, cliente.nome, cliente.endereco, cliente.email, "
                    + "cliente.cidade, cliente.bairro, cliente.cep, cliente.uf, cliente.celular, "
                    + "cliente.fone, cliente.cpf, cliente.obs, cliente.rg, cliente.orgaorg, "
                    + "cliente.data_cadastro, cliente.cnpj, cliente.contato, cliente.fax, cliente.auditoria "
                    + "FROM public.cliente WHERE cliente.nome like '%"+ iPesquisa +"%' ORDER BY cliente.nome LIMIT (50);";break;
            case ICliente.SQL_CPF: sql = "SELECT cliente.cliente_pk, cliente.nome, cliente.endereco, cliente.email, "
                    + "cliente.cidade, cliente.bairro, cliente.cep, cliente.uf, cliente.celular, "
                    + "cliente.fone, cliente.cpf, cliente.obs, cliente.rg, cliente.orgaorg, "
                    + "cliente.data_cadastro, cliente.cnpj, cliente.contato, cliente.fax, cliente.auditoria "
                    + "FROM public.cliente WHERE cliente.cpf = '"+ iPesquisa +"';";break;    
            case ICliente.SQL_DATA_CADASTRO: sql = "SELECT cliente.cliente_pk, cliente.nome, cliente.endereco, cliente.email, "
                    + "cliente.cidade, cliente.bairro, cliente.cep, cliente.uf, cliente.celular, "
                    + "cliente.fone, cliente.cpf, cliente.obs, cliente.rg, cliente.orgaorg, "
                    + "cliente.data_cadastro, cliente.cnpj, cliente.contato, cliente.fax, cliente.auditoria "
                    + "FROM public.cliente WHERE cliente.data_cadastro = '"+ iPesquisa +"';";break;                   
            case ICliente.SQL_GETALL: sql = "SELECT cliente.cliente_pk, cliente.nome, cliente.endereco, cliente.email, "
                    + "cliente.cidade, cliente.bairro, cliente.cep, cliente.uf, cliente.celular, "
                    + "cliente.fone, cliente.cpf, cliente.obs, cliente.rg, cliente.orgaorg, "
                    + "cliente.data_cadastro, cliente.cnpj, cliente.contato, cliente.fax, cliente.auditoria "
                    + "FROM public.cliente;";break;     
        }        
        return sql;
    }

    @Override
    public int getCodigo(int iOpcao, int iCodigoAtual) {
        stmt = null;
        resultado = null;
        conn = null;        
        conn = conexaoBanco.getConexao(); 
        int codigoEncontrado = -1;        
        try{        
            stmt = (Statement) conn.createStatement();
            resultado = stmt.executeQuery(getSQL(iOpcao, String.valueOf(iCodigoAtual)));        
            resultado.next();
            codigoEncontrado = resultado.getInt("cliente_pk");
        }catch(SQLException ex) {
            Logger.getLogger(ClienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro ao execultar a sql de Pesquisa:\n"+
                    ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                conn.close();
                stmt.close();
                resultado.close();
            } catch (SQLException ex) {
                Logger.getLogger(ClienteDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }            
        }        
        return codigoEncontrado;  
    }

    @Override
    public ClienteModel getObject(int id) {
        ArrayList<ClienteModel> listaClientes;        
        listaClientes = pesquisar(ICliente.SQL_CODIGO, String.valueOf(id));
        ClienteModel clienteTemp;
        clienteTemp = listaClientes.get(0);
        return clienteTemp;
    }
    
}
